<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        var obj = {x:1};
        obj.x; //自身的属性
        obj.y = 2 
        obj;
        obj.toString; //原型链上的toString方法
        obj.toString = function(){console.log("My toString")};//自身的toString
        obj.toString; //先访问自身的 没有访问原型的
        delete obj.toString;//删除自身的
        obj.toString; //访问原型上的toString方法
        
        var obj = {
            //自有方法
            name: "Lily",
            age: 20,
            hobby: "swimming"
        };
        //继承方法 可枚举属性
        obj.__proto__.sayName = function() {
            console.log("Hello,我的名字是" + this.name);
        };
        obj.sayName(); //Hello,我的名字是Lily
        var jack = {name: "jack"};
        jack.sayName(); //Hello,我的名字是jack

        Object.defineProperty(obj, "married", {
            value: false,
            writable: true,
            enumerable: false, //不可枚举
            configurable: false
        });
        obj.married; //false
        //hasOwnProperty定义在原型对象上  所用实例都可以访问
        // 判断对象自身属性中是否具有指定的属性
        console.log(obj.hasOwnProperty("name")); //true
        console.log(obj.hasOwnProperty("toString")); //false
        console.log(obj.hasOwnProperty("married")); //true
        
        //getOwnPropertyNames定义在Object对象上 是静态属性 只能够通过Object构造函数使用
        // 返回一个由指定对象的所有自身属性的属性名（包括不可枚举属性）组成的数组
        console.log(Object.getOwnPropertyNames(obj)); 

        // 检查它（包括它的原型链）是否包含具有指定名称的属性的对象。
        console.log("name" in obj); //true
        console.log("married" in obj); //true
        console.log("sayName" in obj); //true
        console.log("married" in obj); //返回是什么，和后边for in对比，关于属性是否可枚举

        //遍历所有可枚举属性  为什么没有toString属性呢？不可枚举
        // 包括sayName 
        // 原型上的遍历一个对象的所有可枚举属性键（包括自有和继承）
        for (var key in obj) {
            console.log(key);
        } 

        // 原型链
        var Student = function(id,name,age){
            this.id = id;
            this.name = name;
            this.age = age;
        }
        var stu = new Student(001,"Lily",20);
        stu.__proto__ === Student.prototype;
        stu.__proto__.__proto__ === Student.prototype.__proto__;
        Student.prototype.__proto__ === Object.prototype;
        Object.__proto__ === null;

        Object.__proto__ === Function.prototype;

        Object.constructor.name; //Function
        Math.__proto__ === Object.prototype;
        Object.prototype.__proto__ === Object.prototype; //false
        Object.prototype.__proto__; //null
        Math.__proto__; //没有prototype

    </script>
</body>
</html>